package hdsy.exception;

import java.awt.Component;

public class AshException extends Throwable{

	private static final long serialVersionUID = -6963187366089365790L;

	/**
	* This field <code>alerter</code> is used to show the information the Class offered.
	* @see javax.swing.JOptionPane
	*/
	public AshException(){
		
	}
	public AshException(String msg){
		super(msg);
	}
	/**
	* This static method create an instance of the ExceptionManager by invoking the
	* constructor <code>ExceptionManager(String msg)</code>.
	* @param msg	The message will pass the specified constructor
	* @return	An instance of the ExceptionManager created by invoking the constructor
	* <code>ExceptionManager(String msg)</code>.
	*/
	public static AshException wrap(String msg){
		return new AshException(msg);
	}

	/**
	* This static method create an instance of the ExceptionManager by invoking the
	* constructor <code>ExceptionManager(Throwable throwable)</code>.
	* @param throwable	 The cause will pass the specified constructor
	* @return	An instance of the ExceptionManager created by invoking the constructor
	* <code>ExceptionManager(Throwable throwable)</code>.
	*/
	public static AshException wrap(Throwable throwable){
		return new AshException(throwable);
	}

	/**
	* This static method create an instance of the AshException by invoking the
	* constructor <code>AshException(String msg,Throwable throwable)</code>.
	* @param msg	 The message will pass the specified constructor
	* @param throwable	 The cause will pass the specified constructor
	* @return	An instance of the AshException created by invoking the constructor
	* <code>AshException(String msg, Throwable throwable)</code>
	*/
	public static AshException wrap(String msg,Throwable throwable){
		return new AshException(msg,throwable);
	}

	/**
	* Constructs a new instance with the specified detail message. The concrete handler
	* is its super class. This constructor always used to construct a custom exception
	* not wrapping the exist exception.
	* @param msg	 the detail message which is the part of the information will be
	* shown.
	*/


	/**
	* Constructs a new instance with the specified detail cause. The concrete handler
	* is its super class. This constructor always used to wrap an exist exception.
	* @param throwable	 the cause which has been caught. It's detail message and
	* stacktrace are the parts the information will be shown.
	*/
	public AshException(Throwable throwable){
		super(throwable);
	}

	/**
	* Constructs a new instance with the specified detail message and cause. The
	* concrete handler is its super class. This constructor always used to construct
	* an exception wrapping the exist exception but requires a custom message.
	* @param msg	 the detail message which is the part of the information will
	* be shown.
	* @param throwable	the cause which has been caught. It's stacktrace is the parts
	* the information will be shown.
	*/
	public AshException(String msg,Throwable throwable){
		super(msg,throwable);
	}

	/**
	* Show the information with everything is default.
	*/
	public synchronized void alert(){
		alert((Component)null);
	}

	/**
	* Show the information in a dialog with the specified title
	* "ThrowableManager Alerter". The dialog belongs to the given component which
	* default is the screen.
	* @param parent	The component cause the exception.
	*/
	public synchronized void alert(Component parent){
		alert(parent,"ThrowableManager Alerter");
	}

	/**
	* Show the information in a dialog with the specified title.
	* @param title	 The title of the dialog.
	*/
	public synchronized void alert(String title){
		alert((Component)null,title);
	}

	/**
	* Show the information in a dialog which has the specified title and belongs to the
	* specified component.
	* @param parent	The component cause the exception.
	* @param title	 The title of the dialog.
	*/
	public synchronized void alert(Component parent,String title){
		StringBuilder errorMessage=new StringBuilder();
		errorMessage.append(this.toString());

		for (StackTraceElement st:((this.getCause()==null)?this:this.getCause()).getStackTrace()){
			errorMessage.append("\n\t at ");
			errorMessage.append(st.toString());
		}
		System.err.println(errorMessage);
	}
}

	